package com.example.persion.controller;


import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.persion.commmon.lang.Result;
import com.example.persion.pojo.Blog;
import com.example.persion.service.BlogService;
import com.example.persion.service.UserService;
import com.example.persion.util.ShiroUtil;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author dushaoqin
 * @since 2022-05-21
 */
@RestController
public class BlogController {


    @Autowired
    BlogService blogService;

    @GetMapping("/blog")
    public Result list(@RequestParam(defaultValue = "1") Integer currentPage){

        //  分页 参数 Mybatis-plus  表示当前页码数  当前页码展示多少数
        Page page = new Page(currentPage,5);

        IPage pageData = blogService.page(page,new QueryWrapper<Blog>().orderByDesc("created"));

        return Result.succ(pageData);
    }

    @GetMapping("/blog/{id}")
    public Result detail(@PathVariable(name = "id") Long id){

        Blog blog =blogService.getById(id);
        Assert.notNull(blog,"该博客已经被删除");


        return Result.succ(blog);
    }



    //  定义了 权限认证接口   需要进行授权之后  才可以进行访问
    @RequiresAuthentication
    //  博客的编辑
    @PostMapping("/blog/edit")
    // 第一个注解 当前的名称的合法性进行检验
    public Result edit(@Validated @RequestBody Blog blog){

        // 对blog 进行判断 其中是否含有id  有 则是一个编辑的状态  没有就是一个添加的状态
        Blog  temp=null;
        if(blog.getId() !=null ){
            temp=blogService.getById(blog.getId());
            // 只能是编辑自己的文章  使用断言  当前查出的userid值要和Shiro中对应id相等
            Assert.isTrue(temp.getUserId().longValue() == ShiroUtil.getProfile().getId().longValue(),"没有权限编辑");

        } else{
            temp = new Blog();
            temp.setUserId(ShiroUtil.getProfile().getId());
            temp.setCreated(LocalDateTime.now());
            temp.setStatus(0);
        }

        //  将 blog对象中的属性  绑定到temp中   后面表示对其他属性的字段进行忽略
        BeanUtil.copyProperties(blog,temp,"id","userId","created","status");
        blogService.saveOrUpdate(temp);


        return Result.succ("操作成功");
    }


}
